PDF版はこちら BACK
| プログラミング進化論 ─プログラミングで見るコンピュータ Seibun Satow Jan, 17. 2009 "Philosophy is written in this grand
  book, the universe, which stands continually open to our gaze. But the book
  cannot be understood unless one first learns to comprehend the language and
  read the letters in which it is composed. It is written in the language of
  mathematics, and its characters are triangles, circles, and other geometric
  figures without which it is humanly impossible to understand a single word of
  it; without these, one is wandering around in a dark labyrinth”. Galileo Galilei Il Saggiatore 1 コンピュータとは何か  「繊維王」豊田佐吉の長男豊田喜一郎は、1921年、10ヶ月に及ぶ欧米旅行に出かける。この寡黙な青年は、ローリング・トゥエンティーズのアメリカにおいてT型フォードが席巻するモータリゼーションに驚嘆している。まだ大八車が走っている日本とは大違いだ。帰国後の23年、関東大震災の復興のため、東京市はフォード社製トラックのシャーシを800台分輸入し、バスに改造する。このいわゆる「円太郎バス」が大衆の足となり、このアイデアが全国に広がっていく。その光景を眼にした喜一郎は、アメリカのように、日本もいずれ大衆がクルマを所有する「自動車の時代」が到来することを確信し、自動車会社の創設を心に誓う。彼は、自動車熱をいさめる豊田自動織機製作所の社長豊田利三郎に対し、「自動車産業をつくり上げるために自分が豊田財閥をつぶしても、おやじは文句をいうまいよ」と返答している。1937年、その豊田自動織機製作所の自動車部が独立し、トヨタ自動車工業が創業され、利三郎が社長、喜一郎は副社長に就任する。社名をカタカナにしたのは、「豊田という人名から離れることによって、個人的企業から社会的存在になる」(本間之英『社名の由来』)ことを目指したからである。翌38年、トヨタは愛知県挙母町に200万平方メートルの工場を完成している。89年、同地域は、この巨大な自動車企業が本社を置いている事情も考慮して、名称を「豊田市」と変更する。現在、豊田自動織機の筆頭株主はトヨタ自動車となっている。  モータリゼーションに関する喜一郎の予見は正しかったが、20世紀後半、その繊維産業で考案されたアイデアが生活の隅々にまでいきわたる。それは今や欠かすべからざる社会的インフラと化し、自動車産業にとってもなくてはならないものである。  それこそがコンピュータである。  コンピュータの起源はその定義にかかわっている。「コンピュータ(Computer)」を「計算器」と考えるなら、それはブレーズ・パスカルやゴットフリート・ライプニッツに遡る。前者は、1642年、歯車式の加減計算器を発明し、後者は、1694年、さらに乗除や平方根まで扱える歯車式の計算器を開発している。  しかし、計算器とコンピュータとでは決定的に異なる点がある。前者は後者と違い、前もって計算手順を指示することができない。それが可能であるとすれば、操作を変更することができる。コンピュータは、そう考えると、「計算器」ではない。「器」には、一つのことに役立つが、その他には融通が利かないものという意味がある。なぜコンピュータの訳語が「電子計算機」であって、「電子計算器」ではないのかを熟慮する儀津ようがある。  確かに、コンピュータは計算している。一般のユーザーにとってコンピュータ上での計算はEXCEL程度だとしても、それ以外のWordやPaintなどのアプリケーションにおいてもコンピュータは計算している。  コンピュータは、稼動中、人の手が入らなくても自動的に計算を行う。そのためには、前もってそれぞれの処理の手順を厳密に順序よく指示する命令を記述しておかなければならない。「プログラム(Program)」が不可欠である。あらかじめ一連の計算手順をプロスラムとして記しておけば、プログラム自身にも計算を施すことができ、それが判断して次の操作を変更できる。そう考えるならば、コンピュータは「データ処理装置」だと言える。計算器よりもシリンダー・オルゴールや目覚まし時計の方がコンピュータに近い。  データと情報はしばしば混同されているが、両者は厳密には異なっている。前者は機械による処理に適した記号の表現であり、後者は一定の約束事に基づいてそれに人間が与える意味である。  コンピュータは杓子定規である。「そんなこと言わないでさあ〜ちょっとだけでいいからさ、負けてくれない〜」とはいかない。現実的な時間内に有限的な計算手順によってデータを正確に処理するためのアルゴリズムが必須である。計算もプログラム次第だということは、コンピュータによる解決が果たして学問上認められるかどうかという問題を招いてしまう。その典型が4色問題である。それは、どんな地図も、4色あれば、隣接する領域が異なる色で塗り分けられるはずだという問題である。ただし、統一前の西ベルリンのような飛び地は考えないものとする。1976年に ケネス・アッペル とウルフガング・ハーケン 
  はコンピュータを利用して、この4色定理を証明する。しかし、彼らが書いたのは計算式ではなく、プログラムである。このプログラムは非常に複雑で、第三者による検証が困難であり、また、コンピュータ自体のトラブルもありえたため、当初、彼らの発表に異議をさしはさむ声も少なくない。その後、別のハードウェア上で違うプログラムを用いても同一の結果が出たことから、4色問題は解決され、「4色定理」と認められている。もっとも、コンピュータは未解決の問題を解き、人類の英知に寄与しなければならないという崇高な使命感、および何が何でも達成するのだという不撓不屈の頑張りに支えられていたわけではない。与えられたプログラムに従って、まさに機械的に計算しただけである。  4色定理は、数学的には、グラフ理論に含まれる。グラフ理論で言う「グラフ」は地図や設計図など点と線で構成された関係図を指す。その起源は一筆書き問題に遡る。一筆書きは、つながっている線が奇数の「奇点」がなく、すべての点が結んでいる線が偶数である「偶点」という場合で可能になる。このアイデアはさまざまな対象に応用できる。時間割や電車の乗換図などもそうであるが、4色問題もその一つである。  今日のコンピュータの原理的な母体は、1801年にジョゼフ・マリー・ジャカール(Joseph Marie Jacquard)が発明した模様を織りこめる自動織機である。このフランス生まれの機械は、日本に伝わった際に、「ジャカード織機」として定着する。フランス語ではその固有名詞の末尾のdは、本来、発音しない。多色で、複雑な模様の織物を「ジャガード織」と呼ぶが、それが訛ったものである。19世紀の産業革命をリードした繊維産業におけるこの発明が20世紀後半世界を大きく変えることになる。  模様を織り出すには、異なった色に染められた縦糸と横糸の交差を変更させなければならない。縦糸を持ち上げて横糸を下に通し、また横糸をそのままにして横糸を上に通過させる工程によって模様がつけられる。これは従来手作業だったが、ジャカールはカードに横針と縦針を組み合わせた仕掛けにより機械化する。  織物パターンに対応した孔を開けられたカード、すなわちジャカール・カードを用意する。クランク機構によってナイフ箱が引き上げられると、ナイフにひっかかった縦針が持ち上がり、縦糸もつられて上がってその下を横糸が通過する。どの縦針がひっかかるかは横針の動き次第である。カードを入れ替えれば、別の模様を織り出すことができる。ジャカード織機はパンチ・カードによって制御されている。  カードの孔に当たった横針は決まった方向に動き、それによってバネ状になっている縦針が開放され、上部がその方へ振れ、ナイフにひっかかる。こうした織機の動作に伴い、シリンダーが動き出してカードを操り、横糸の位置を次々と指示する。しかも、この過程は反復可能である。孔あきカードを糸でつないでループにしておけば、同じ模様を大量に生産できる。  ジャカールは、その精巧さを人々に納得してもらうために、自分のポートレートを1万4000枚のカードを使って実演している。それを見て、よくできた絵だと誰もが思いこんでしまったと言われている。  ジャカード織機は、1873年、フランスから日本へ輸入される。日本の繊維産業が近代化されるはしりとなっている。1890年、洋式大型力織機が織物工場に導入される。力織機は「動力織機」の略称である。1897年、豊田佐吉はそれらを参考に、木製力織機発明する。これに刺激を受け、明治30年代、石油発動機を使い、安価で、小幅布を生産できる国産力織機が普及し始める。豊田佐吉は、1906年、豊田式織機会社を設立し、26年、自動織機を完成させる。  ジャカード織機をハードウェアとすれば、カードはコマンド、その順序立てがプログラムと見なせる。カードを変えるだけで、同じ織機で、別の模様を織り出せる。同様に、ソフトウェアを変更すれば、ハードウェアでそのままでも違う作業ができる。ジャカード織機がコンピュータの重要な原型と見なされているのはこのためである。  このアイデアを計算エンジンに応用できないかと考えた人物がドーバー海峡の向こう側に現われる。 つう あたしをわすれないでね。 (木下順二『夕鶴』) 2 プログラム言語の誕生  他国に先駆けて産業革命が進展したイギリスであったが、いかんせん島国であるため、原材料と製品の輸送には海上交通が不可欠である。しかし、経度を知るのに、天測に時計、それと三角計算だけでは、その安全性・確実性を確保することは至難の業である。しかも、グリニッジ天文台発行の航海暦や対数表に不備があることがこの頃には明らかとなっている。これを解決するためには、産業革命の時代にふさわしい機械が必要だ。数値の正確な計算と転記に伴うミスをなくす計算結果の自動印刷が可能な機械を開発しなければならない。  この使命にとりつかれ、ケンブリッジ大学教授の椅子を捨てて、一生を捧げたのがチャールズ・バベジである。  彼は、まず、「階差機関(The Differential Engine)」を考案する。三角関数などの複雑な計算を階差の計算に分解し、その単純な加算にして結果を出せばいい。歯車と歯車の回転を組み合わせれば、加算を表現できる。しかし、政府が資金を渋り、機械加工業者とももめたため、1833年、この計画は中止に追い込まれる。  そこで、バベジは、翌年から階差機関を発展させた「解析機関(The Analytical Engine)」の開発にとり組み始める。第三の歯車を連結させれば、計算の途中結果に従って、別の計算手続きも重ね合わせられる。このアイデアを進めるなら、多くの歯車を円周上に配置すると、計算に計算をさらに重ねあわせることもできるし、途中で関連計算を挿入できる。  これは、現代の用語で言うと、「サブルーチン」に相当する。バベジの機関は、明らかに、計算器ではなく、コンピュータである。実際、彼の設計にはメモリやレジスターに当たるものが見られる。なお、彼の予測では、このエンジンの処理速度は加減算で1秒、100桁×50桁の乗算なら1分、メモリの容量は10進数で1000個である。  バベジはジャカード織機からインスピレーションを受け、演算・変数・定数の三種類のカードを使う構想を立てている。演算カードは孔の位置で加減乗除を指示する。変数カードは演算対象の数値を示し、歯車機構にそれを装填する。定数カードは必要に応じて対数の値など定数を挿入する。この三種類のカードを用いれば、  この解析機関の本体は、結局、部分的試作品だけで終わる。しかし、計算手続きに関しては非常に発展している。それを彼にもたらしたのがエイダ・ラブレス夫人である。このジョージ・バイロン卿の娘はif文(判断)やgoto文(飛び越し)などを考案し、アルゴリズムの発想を導入している。父の言葉は人間の心を揺り動かしたが、娘は機械を動かす言語のアイデアを導き出している。「ジャカード織機が花や葉を織り出すように、解析機関は代数を織る(The Analytical Engine weaves algebraic
  patterns just as the Jacquard loom weaves flowers and leaves)」。そう彼女は言い残している。  アルゴリズムはプログラムをそれによる計算を通じて変更することを可能にする。これは極めて画期的なアイデアである。理論上はアルゴリズム化できる問題は機械で解けるということになるからである。しかし、以降、さまざまな計算をする機械が考案・開発されてきたが、これを実現するものはなかなか登場しない。1946年に誕生した世界最初のコンピュータとされているENIACでさえ、記憶したプログラムに対して計算することはできない。何しろ、演算速度が遅いため、計算途中にカードからの読みこみでプログラム変更が十分間にあうからである。  ENIACでは、ケーブルの配置がプログラムであり、プログラミングは非常に手間暇のかかる作業である。プログラム手順は、数多くの孔が開いた金属板のパッチボードにパッチコードを差しこむようにして表わされている。プログラムを変更するためには、ケーブルを差し替える必要がある。  しかも、この約1万8000本もの真空管によって構成された電子計算機は10進法、より正確には2進化10進法を用いている。10進数をそのまま電圧や電流で表わそうとすると、0から9に対応する10種類の値を使わなければならない。そのため。電圧や電流がわずか数%変動しただけで、値が違ってしまう。一方、2進法なら、0と1の区別だけですむ以上少々電流や電圧の値がずれたところで、影響は受けない。  2進化10進数は10進法での1桁を0から9までを表す4桁の2進数、すなわち0000から1111で表わす表現法である。この4桁はそれぞれ2の3乗、2の2乗、2の1乗、2の0乗に当たる。5は2の2乗と2の0乗であるから、0101、8は2の3乗であるので、1000と示される。2進化10進数はデータの入出力には便利であるが、表現に少々無駄が生じる。この表現では0000から1111.までの2の4乗、すなわち16通りの組み合わせのうち、1010から1111の6通りが使われない。純2進数の方が効率がよい。しかも、2進法を採用しても、10進法と比較して、桁が増えることはない。10進数を純2進数で表わした場合、桁数は3.3倍にしかならない。3桁の10進数は10桁の2進数で表現できる。2の10乗は1024.である以上、999.までの10進数は収まる。2進1桁を「ビット」と呼ぶ。64ビットあれば、19桁の10進数を表わせる。  2進化10進数は、とは言うものの、デジタル世界から完全に追放されたわけではない。誤り訂正符号理論の応用と共に、ある意味で、復活する。この理論は、詳細は省くが、0から15までの数を4桁の2進数で表わすことで可能になる。10進数の15は2進数の1111である。これを使うと、数字当てマジックを披露できるので、興味のある人はチャレンジしてみることを尾お勧めする。現在市販されているCDには、誤り訂正符号理論を応用して、同一の情報が三つ並べて記録されている。この配置により、一部データが失われたとしても、誤りを訂正して元の情報に復元できる。2進化10進数から姿を変えた16進数は、これ以外にも、デジタル技術に数多く応用されている。  しかも、19世紀、イギリスの数学者ジョージ・ブールは、2進法を使うことで、論理命題のような定量化できない実体に数学的手法を応用できることを明らかにしている。のみならず、コンピュータの計算機構の設計上でも基本的な原理を提供している。これは「ブール代数」と呼ばれ、0と1の二つの元からなり、次のような独特な演算法則を持っている。  0×0=0 0×1=0 1×0=0 1×1=1  0+0=0 0+1=0 1+0=1 1+1=0  これらは2進法の計算であり、最後の式は1+1=10でなければならないが、1の位だけを使うことにする。この×を「交わり(∩)」、すなわち積集合、+が「結び(∪)」、すなわち和集合を意味するとすれば、次の二つの分配が成り立つ。  A×(B+C)=(A×B)+(A×C)  A+(B×C)=(A+B)×(A+C)  前者は通常の計算でも成り立つが、後者はそうではない。一県縁遠いに見えるかもしれないが、コンピュータの一般ニューザーであっても、このブール代数の最も身近な応用例を頻繁に使っている。それは検索エンジンにおけるOR検索やAND検索である。  プログラムはコマンド、すなわち命令が組み合わされているが、そこでも2進数が非常に有効である。コマンドにはOF文のような分岐命令がある。この分岐命令が一つであれば、確かに、「イエスかノーか」の二つの区別しかない。しかし、分岐命令の使用は区別をネズミ算式に増えていく。分岐命令が10段であれば、その区別は2の10乗、すなわち1024通りである。数は、予想の反して小さくなることもあれば、大きくなることもある。  プロフラムを備えた2進数のコンピュータという発想は、むしろ、ENIACの後継機として開発されたEDVACの方にある。1946年、ペンシルヴァニア大学において、ジョン・プレスパー・エッカートやジョン・ウィリアム・モークリーなどが着手する。エッカートがデータの出し入れを飛躍的に速くできる水銀遅延線と呼ばれるメモリを考案し、演算速度をさらに高める可能性が生まれる。そこで、コンピュータにプログラムを内蔵させ、必要に応じてそれを計算途中でも変更できるようにしたらどうかと試行錯誤し始める。プログラムを構成する命令を2進数で表わし、その組み合わせをコンピュータのメモリに記憶させておいて、実行する。この方式、すなわち「プログラム内蔵方式(Stored Program)」は、そのアイデアを耳にしたジョン・フォン・ノイマンらが1945年から46年にかけてまとめたレポートに初めて登場している。ところが、このEDVACは、諸般の事情により、大幅に完成が遅れてしまう。結局、史上初の稼動したプログラム内蔵方式かつ純2進数のコンピュータの栄誉は、ケンブリッジ大学のモーリス・V・ウィルクスらが開発したEDSACに譲ることになる。  しかし、この段階では真空管方式であったため、コンピュータのサイズは巨大、電力消費量も膨大で、世界にとってほとんどスペース・シャトル並みの存在でしかない。ハードディスクやLSIなどまだ夢の世界である。  世界最初の商用コンピュータUNIVACが1951年の大統領選挙の結果予想に採用される。開票率わずか7%の段階でドワイト・アイゼンハワーの当選を的中させ、これがコンピュータの力を世界に知らしめることになる。ここからコンピュータは小型化・高速化・信頼性・汎用性という四つの目標を達成すべく発展していく。  1952年、合衆国の数学者グレース・マレー・ホッパーは、UNIVAC I 向けに、世界初のコンパイラ「A-0
  System」を開発する。これはコンピュータ上で動作し、コマンドを機械語に返還するソフトウェアである。正しく稼動することが確認されたサブルーチンを集めて、ライブラリを作成しているうちに、この発想にたどり着いている。こうした経緯から、現在ではコンパイラは自然言語に近い文法を持ったプログラム言語を自動的に機械語に翻訳するソフトを指すが、A-0 Systemは、むしろ、機械語の断片を結合させるリンケージエディタの機能を果たしている。  コンピュータの「中央演算処理装置(Central Processing Unit: CPU)」の行う情報処理は、単純な作業の組み合わせである。その個々の処理に1対1で対応するコマンドが「機械語(Machine Code)」にほかならない。機械語はメモリ上に書き記しておいて実行されるので、基本的に、2進的記号である。最近は16進数も用いられるが、これも2進数の延長である。。ハードウェアのためのコードである以上、人間が直接記述することは非常に難しい。  そこで、人間が解読しやすいように、機械語に1対1で対応するアセンブリ語が考案される。アセンブリ語のプログラムは、アセンブラと呼ばれるプログラムによって、機械語に変換される。1950年代のコンピュータのプログラム記述には、このアセンブリ言語がよく用いられている。機械語同様、CPUに依存しているため、ハードウェアが違うと使えない事態も起きる。  アセンブリ言語では、2進数的記号だけでなく、アルファベットも用いられる。”mov”が”move”の意味であるように、それぞれの命令を想起させるアルファベットの単語を対応させ、アセンブラが数値に変換して機械語に翻訳する。この語呂合わせは「ニーモニック」と呼ばれる。  今日、機械語やアセンブリ言語は、CPUに依存しないプログラム言語の「高級言語」と区別して、「低級言語」と呼ばれている。これらは一般的には馴染みは浅くないが、その分、一度その魅力の虜になると口では言い表しがたい奥深さと快感もある。単純なコマンドを組み合わせて複雑な作業を実行するプログラムを書く苦役に背筋がぞくぞくさせながら、恍惚の表情を示す姿は、余人には理解しがたいだろう。  そういったプログラムの快楽以外にも、低級言語は主に二つの理由から今でも習得されている。低級言語の規則を理解していると、高級言語で記述した際にも、効率のよいプログラムに仕上げることができる。また、自社の知的財産権を守るために、機械を管理するハードウェアから製作する企業もあり、そのコンピュータ独自の低級言語でプログラムを書けば、コピーしようとしても割に合わない。  コンパイラが開発されたということは、CPUに依存せず、汎用性のあるプログラムのための言語が可能になったことを意味する。アセンブラもコンパイラも、基本的には、その元となるプログラムである「ソース・コード」を機械語の「オブジェクト・コード」への翻訳ソフトである。コンパイル以前のコードは「テキスト・ファイル」、機械語プログラムは2進数化されたファイルということで「バイナリ・ファイル」と呼ばれる。  なお、Javaというプログラム言語はこうした変換過程を辿らない。ソース・コードは、Javaにおいて、コンピュータの種類を問わない「バイト・コード」と呼ばれる中間プログラムにコンパイルした後、各ハードウェアごとに用意されたソフト「Java仮想マシン(JVM)」を通じて逐次翻訳しながら、実行する。  1957年、IBMのジョン・バッカスが最初の高級言語の「FORTRAN(Formula Translator)」を発表する。学術計算に優れたこの言語は、アセンブリ語しかない当時にあって、非常に使い勝手がよく、急速に研究者の間に浸透している。複素数を扱えることができ、また数の数学関数を組み込み関数としてサポートする。さらに、汎用コンピュータ・システムで使用することができるため、科学技術計算用の膨大なライブラリを利用できる。現在に至っても、この言語は数値計算界では依然として王者の地位を保ち続けている。  グレース・ホッパーが、1959年、データ処理向きの高級言語の「COBOL(Common Business-Oriented Language)」を開発する。英吾に近い文法博文をし、簡易言語の先駆と言える。インデックス付きファイル・アクセスや10進数演算機能、簡便な画面定義機能など事務計算に特化した特徴がある。ライブラリ・プログラムを持っていないため、力ずくが必要な計算には適さない。煩雑な事務処理に頭を悩ませていた企業や官庁が飛びつき、COBOLは爆発的に普及し、現在でも、民間企業を中心に世界で最も使われているプログラム言語である。  FORTRANとCOBOLは、コンピュータが計算する機械であると同時に、データ処理装置であるという二面性をよく表している。また、FORTRANとCOBOLの生まれた順序も計算器が先に考案され、その後にジャカード織機が発明されたという歴史とも符合する。その上、エイダ・ラブレスやグレース・ホッパーという女性がデータ処理のためのプログラムの発想を思いついたということも、「ジェンダーとコンピュータ」を言い出すまでもなく、興味深い。  男味のほうが集中的とするなら、女味のほうが分散的だろう。なんでも一つにかたまって集中するのがよいように考えられてきたが、そうでもない。  たとえばテストのときは集中力と言い、たしかに一つの方向に世界を定めて集中するのが有効だが、そうばかりでもない。テストのあとでぼんやりと心を開いていると、なんでもない解き口が見つかったりすることがある。  よいアイデアは、世界を閉じるより、できるだけ心を開いて外からの兆候を感じたほうがよい。そして、そのアイデアをかためるときは集中力が必要。(略)  あるいは、男味は計画達成型で、女味は状況反応型であろう。男味がすぎると計画にこだわるし、女味がすぎると状況に流される。男文化のモラルでは、「男はいったん決めたら、まわりを気にせずとことんやる」ことで、女文化のモラルでは、「まわりの様子への気くばりがなにより」となる。それで、男の子と女の子がいると、男の子がなにか欲しいときは自分の熱意と理屈で迫り、女の子だと親の機嫌の流れを読みとる。  男味のほうが安定性を必要とするものづくり産業に向いていて、女味のほうがアパレルのような情報付加産業に向いていよう。時代としては情報の部分が増えて、女味に向かっている。 (森毅『男文化の行方』) 3 構造化プログラミングとオブジェクト指向プログラミング  FORTRANやCOBOL以降、多種多様のプログラム言語が誕生する。電算界におけるヨーロッパの威信回復という反米イデオロギー色の濃いALGOL。OSの必要性からそれを記述するプログラム言語として生まれたBが発展し、UNIXの普及と共に、その小回りのよさから受容されたC。初期のパソコンの際に入門としてユーザー層を拡大したインタープリタ言語BASIC。その見通しのいい文法によりプログラミング教育に用いられたPascal。児童向けの教育プログラムとして知られるLOGO。モジュール式プログラミングを強調したいささかアナーキーなModula-2。超ド級の巨大なプログラム執筆に適したC++やJava。 FORTRAN・COBOL・ALGOLの重要な特色を統合するという野心的なPL/1。リスト形式のデータを扱うのに用い、人工知能向けの標準的言語のLISP。関係データベースとくればこれと確固たる地位を誇るSOL。交通や軍の管理制御システムで重宝されているAda。その理想の高さに熱狂的な信奉者に支持されるSmalltalk。日本発のオブジェクト指向言語と脚光を浴びたRuby。インターネットの普及と共に最も身近なプログラム言語と認知されるHTML。ブラウザ上で動作するスクリプト言語の代表格JavaScript。列挙すればきりがない。  これだけプログラム言語が出現すれば、分類・整理する動きが生ずるのも当然であろう。すでに言及した高級言語と低級言語の区分もその一つである。市販ソフトウェアは、一般的に、コンパイラ済みの機械語の形式で配付される。実行速度が速いし、多数の異なった種類のファイルの管理も可能で、なおかつ解読されにくいというのが主な理由である。なお、機械語のファイルを解読してアセンブリ語に変換する逆アセンブラのソフトウェアもあるが、商業ソフトでは厳しく禁止されている。  他にも、高級言語を翻訳する手順によるコンパイラ型とインタープリタ型という分類もよく知られている、前者はコンパイラによってプログラム全体を一気に機械語に翻訳するプログラムである。FORTRANやCがその代表である。後者はインタープリタがプログラムを一行ずつ読みこんで逐語的に訳すプログラムである。この特性によってかつてユーザーを爆発的に獲得したのがBASICである。かつてはパソコンを手にしたら、最初に覚えるプログラム言語というのが半ば常識である。コンパイラ型と比べて、インタープリタ型は実行速度の点で、どうしても遅くならざるをえない。しかし、バグを見つけやすいという利点がある。  ただ、この区別は、プログラミングで見るコンピュータという観点からは、本質的ではない。パソコンの処理速度の飛躍的な向上もあり、両者の差異は一般ユーザーにとっては必ずしも決定的ではない。また、Perlのように、コンパイラとインタープリタの区分が曖昧な言語もいくつか出現している。付け加えると、言語と言語処理系の処理方式は別物と考えるべきである。Cにもインタープリタ型が存在するし、Javaでも機械語に直接コンパイルする方式もある。  むしろ、「プログラミング」という点から分類する方がプログラム言語の本質を踏まえている。コンピュータの性能が向上するにつれ、要求される範囲が広がり、求められるレベルも高くなる。それに呼応して、プログラムの規模も大きくならざるをえなくなる。巨大化に伴い、プログラミングにも、チーム・ワークが導入され始める。個人で作成できる時代ではない。かつてはどこの職場や研究所、大学にも書いたプログラムが動かない場合は、エラー箇所を見つける達人が一人はいたものである。しかし、そんな牧歌的な時代は過ぎ去っている。アセンブリ語が生まれ、さらに高級言語が登場したのは、プログラムの書きやすさや見直しの便利さを追求してきたからである。  巨大化した際に、最も問題となったのがgotoである。エイダ・ラブレスの洞察以来、gotoはプログラム作成者にとって非常にありがたいコマンドである。それを使えば、ドラえもんの「どこでもドア」のごとく、プログラムのどこにでも飛ぶことができる。しかし、それは「スパゲッティ・プログラム」という弊害も生み出すことになる。多用されたgoroが複雑に絡み合ってしまい、プログラムが解読不能に陥る。  1967年、オランダのコンピュータ科学者エドガー・ダイクストラが『構造化プログラミング(Structured
  Programming)』を発表する。構造化プログラミングは、見通しを浴するために、gotoを使わず、サブルーチンの呼び出し、およびifとwhileによる制御だけでプログラムを書くという発想である。要約すると、「gotoレス」・「モジュール化」・「トップダウン設計」が基本原理となる。翌年のパリ5月革命を皮切りに、ジャン=ポール・サルトルの実存主義に代わり、クロード・レヴィ=ストロースの構造主義の天下が訪れる。コンピュータ界にも構造主義の時代が到来したというわけだ。  構造主義は20世紀を代表する思想潮流であるが、数学の世界が最も早く、1930年代半ばから始まっている。ブランスの急進的数学者たちは「ニコラ・ブルバキ」という集団的匿名を用いて次々と新たな数学の方法論を発表している。  ブルバキの数学再編成の方法は、「構造」という用語に代表される。それ以前の公理主義から潜在的にあったことではあるが、数学を公理主義的に建設することによって、その具体的内容ではなしに、理論の構成内容、基本的法則とその結合のされ方が完成される。それは、その理論の対象とするものの法則性そのものを、直接に定式化している。そこでは、今までは、ことなる理論の間のアナロジーとして、ややプラグマティックに考えられていたものが、そんなアヤフヤなものではなく、確定した共通理念として定式化され、こうして、分野の専門性の持っていた壁がとりはらわれるのである。  それは、数学的対象(集合)に基本法則(公理)を設定することによって定式化される。理念として、「構造」とは、この「対象」における「法則」の存在様式と考えられる。それは、ブルバキは、集合の要素、または部分(部分集合)、部分集合の族(部分集合の集合)などの結合形式の形で、形式的で集合論的な定式化を行う。こうして、その構造以外の夾雑物を捨象して、議論を展開することが可能になるのである。 (森毅『数学的思考』)  構造化プログラミングはダイクストラの前段階があるけれども、者代の同時代的な共有意識がコンピュータ研究者の間にあり、1970年代に入り、IBMによるソフトウェア開発の技術師範「IPT(Improving Programming Technologies)」を通じて普及する。ALGOLやPascal、Cなど構造化プログラミングに基づいた言語が開発され、さらに、FORTRANやBASICのような構造化プログラムに適していない言語もそれを踏まえたFortranとBasicに生まれ変わる。  構造化プログラミングにおいて、プログラマたちは処理手順と記述を一致させ、gotoをできる限り、可能であれば一切使わない。プログラムは、それにより、「連接(sequence)」・「反復(iteration)」・「選択(selection)」の三つの要素によって折り目正しく構成される。プログラミングにはスケール・メリットはない。そこで、規模の大きいプログラムは、管理しやすい適度なサイズに分割統治、すなわち「モジュール化(module)」し、それらを連接・反復・選択などに注目して抽象化する。端的に言うと、それ以外の情報は捨てる。プログラマは断片化されたプログラムを段階的に詳細化させる。細部の情報を具体的に記述し、段階を追って詳細なものに仕上げていく。このようにして出来上がったプログラムには、その中にアルゴリズムと同時にデータ構造も記述されている。  巨大なプログラムを多人数で書くにはどうしたら合理的かという問いは、しかし、これで解決したわけではない。構造化プログラミングも、80年代が近づくにつれ、スタジアム・ロックよろしく、大規模化し続けるプログラムには対応しきれなくなる。  これはちょうど構造主義の思想的な流行が一段落つき、ポスト構造主義が台頭してくる時期に当たる。何でもありのお祭騒ぎの80年代には構造主義は静かすぎる。構造主義は、日常生活のような繰り返しの多い中で、小さな変化が決定的である場合を考察するのに向いている。文化人類学や発達心理学、言語学、歴史学、文学などの対象を構造化する際に、非常に成果を挙げたのもそのためである。頻繁なもしくは大きな変化になると、構造主義的手法は適用するのが難しい。小津安二郎の映画の分析には構造主義は適しているが、黒澤明には不向きである。  巷に構造主義の入門書が溢れている。しかし、それら上に構造化プログラミングのアイデアがコンパクトにその要点をまとめている。その点でも、構造化プログラミングが過去のものとして顧みられないのはもったいない現状である。  「中心と周縁」や「トリック・スター」など数々の魅惑的概念により構造主義は非常に見通しのよい図式を提供してくれる。短絡的な見立ては、構造主義によって、容易に批判することができる。ジョージ・W・ブッシュ大統領の「テロとの戦い(War on Terror)」はその典型だろう。アメリカ=中心、テロリスト=周縁というわけだ。その単純な図式は、8年間に渡って世界を翻弄し、退任直前、デヴィッド・ミリバンド外相から2009年1月15日付『ガーディアン』紙に「『テロとの戦い』は誤り」と寄稿されることになる。それによると、ブッシュ政権が掲げてきた「テロとの戦い」は、テロの脅威を強調するのに効果的であったことは否定しないけれども、異なる背景や目的を持った勢力を結びつけることを促進させ、イスラム教徒の集結を狙うアルカイダにつけこまれる結果になってしまっている。また、ハード・パワーへの極端な偏重は、テロを力で抑えこむべきだという誤った考えも世界に広めている。テロの封じこめるためには、暴力や弾圧に頼ることなく、法秩序を重んじ、それぞれ個別に問題を解決していかなければならない。テロも個別のオブジェクトとして捉え直す必要がある。  構造化プログラミングの方向性をより発展させたのが「オブジェクト指向プログラミング(Object-Oriented Programming)」である。従来、プログラムはアルゴリズムとデータに分離して処理を手順として捉えられてきたが、データとそれを操作するための「メッセージ」および処理を「オブジェクト」の単位で把握するのがこの新たなプログラミングのアイデアである。オブジェクトはデータ構造とアルゴリズムを持っている。他のオブジェクトにメッセージを送って状態を変化させたり、調査したりすて、処理を行う。言ってみれば、コミュニケーション論の発想からプログラミングを構築する試みである。  構造化プログラミング同様、オブジェクト指向プログラミングの登場にもそれにふさわしい個性的な人物がかかわっている。1970年代初頭、ゼロックスのパロ・アルト研究所のアラン・ケイは、大胆不敵な「ダイナブック(Dynabook)」構想をぶち上げる。コンピュータは一部の研究者やオタクだけのものではない。誰もが使えるものにすべきだ。未来のコンピュータは携帯性があり、高画質なディスプレイを持ち、通信機能を備え、対話可能で、手書き文字も認識できる。それはメディアを超えた最初のメディア、すなわち「メタメディア(MetaMedia)」である。彼が開発に加わった同社の試作コンピュータAltoはマウスの使用、GUI環境、ネットワーク機能などを備え、今日のインターフェースの原型を具現している。ウィンドウやブラウザ、ポップアップメニューなどもこの途上で生まれている。なお、「天下のゼロックスがネズミなんぞ消費者に売れると思うのか?」と判断を下し、商品化を見送った経営陣は、現在に至るまでまぬけの典型として語り継がれている。  その過程でプログラミングにおける新たなパラダイム・シフトが生じる。この構想には、従来のプログラミングならびに言語では不十分であるとして、アラン・ケイはSmalltalkを開発する。そこでは、オブジェクトやクラス、インスタンス、メッセージ、メソッド、インヘリタンスなど数々の奇抜なタームが提唱される。この言語こそがオブジェクト指向プログラミングの先駆となっていく。  Smalltalk以降、オブジェクト指向プログラミングをサポートする言語が次々登場し、近年、新たに生まれるものはこれを前提としている。何しろ、あのCOBOLにもオブジェクト指向機能が付け加えられているほどだ。代表的な言語としては、C++やJava、Rubyなどが挙げられる。中でも、1995年にサン・マイクロシステムズ社が開発したJavaは。gotoをまったく持たず、大規模のプログラムを大勢で書くのに最も適している。JVMを使うために動作が重いという欠点も、ウェブ・コンテンツを提供するサーバのように四六時中動かしっ放しの巨大なコンピュータ・システムであれば、問題とはならない。パパラッチ好みの華やかな主役と言うよりも、存在感のある実力派のバイプレーヤーといった具合だ。  Javaは、”One Write, Run Anywhere”を宣伝文句として華々しく登場している。JVMのため、実際にはそうではなかったけれども、どんなハードウェア上でも実行できる言語が売り物である。当初、ブラウザの中で動作するアプレットの作成に用いられ、2001年以降、携帯電話の中に、ダーツ・ゲームやインベーダーゲームなどのJavaアプレットが楽しめる機種も販売されている。確かに、オブジェクト指向プログラミングの拡張性という利点は、ウェブ上で動作するグラフィック・プログラミングで効果的だ。もともとのソース・コードがなくても、プログラムを拡張できるからである。しかし、動作が重く、ウェブ作成にはFlashやAjaxがとって代わるようになる。そもそも、アプレットのような小さなプログラムをつくるのに、オブジェクト指向プログラミングを最も体現したJavaを用いるのは、その特性を生かしているとは言えない。  オブジェクト指向プログラミングの特徴は三つに要約できる。それは「継承」・「カプセル化」・「ポリモーフィズム」である。  オブジェクト指向の言語では、「クラス(class)」と呼ばれるプログラム単位から成り立っている。これは現代数学の集合論から拝借した概念であろう。クラスはオブジェクトの定義である。”class creature”とすれば、そのオブジェクトは「生物」と定義されたことを意味する。クラスの下位にサブクラスがあるというように、階層化されている場合もある。クラスの間に階層関係があり、サブクラスが上位のスーパークラスの機能・性質をそのまま持つことを「を継承(inheritance)」と言う。  他のオブジェクトに公開しない状態を「プライベート(private)」、公開する状態を「パブリック(public)」と区別して指定できる。プライベートの状態を外部から変えたり、調査したりする際には、オブジェクトに「メッセージ(message)」を送る。他の言語で手続きや関数、サブルーチンを記述した部分を「メソッド(method)」と呼び、このメッセージを送信するために使う。オブジェクトに変数とメソッドを閉じこめて、外部からのアクセスを制限できる。これが「カプセル化(capsulation)」である。  オブジェクト指向プログラミングでは、いちいちクラスをつくり直さなくても、継承の機能を用いると、簡単に「拡張(extend)」が可能である。それは、「生物」というクラスがあったところに、新たに「水中生物」のクラスをつくると思えばよい。を「水中生物」にする。拡張はクラスの再定義を意味する。オブジェクトは自立的に動作するが、クラスという単位によって構成されているため、オブジェクトの型ではなく、クラス型で実装されたメソッドが起動する。クラスが異なれば、同じメソッド呼び出しを実行しても、それに応じたメソッドが起動される。これが「ポリモーフィズム(polymorphism)」である。  これらの特徴により、多人数で書いた大規模なプロフラムを実行して、不具合が生じた場合でも、比較的、問題箇所を見つけやすい。プログラムが巨大になれば、ミスも増えるというものだ。それをどうしたら素早く見つけられるか、すなわち最悪に備えて最善を尽くすにはいかにしたらいいかの命題に対する解決法がオブジェクト指向プログラミングである。これなら、復旧するには、その担当者だけが汗を流せばいい。  日々、新たなソフトウェアやオンライン・サービスが登場し、初心者が直観的に使えるように工夫されているものも少なくない。しかし、その裏には、斬新なプログラミング方式とそのサポート言語の出現という技術的か革新がいくつか見られる。SNSの構成はオブジェクト指向プログラミングの概観によく似ている。「インターネットは今後どう進化していくか」という問いにしても、プログラミング理論のパラダイム・シフトを抜きには語れない。規模が拡大し続けるプログラムとそれにかかわるプログラマたちをいかに組織化すればいいかという命題への新しい解決策が見出されたときに、画期的なデジタル・テクノロジーが誕生するだろう。  その一例として1998年にW3Cから勧告されたXMLが挙げられる。現在のワールド・ワイド・ウェブ上のコンテンツは、主にHTMLというマークアップ言語で記述されている。この言語では文書構造を伝えることはできるけれども、意味を伝達することは不可能である。そこで、ティム・バーナーズ=リーがWWWWの向上を目指して、「セマンティック・ウェブ(Semantic Web)」を提唱する。彼は、WWWで使用される各種技術の標準化を推進する団体「ワールド・ワイド・ウェブ・コンソーシアム(World Wide Web Consortium)」、通称W3Cに所属している。ウェブページの閲覧にデータの交換の機能を加えれば、意味の疎通が可能になる。この目的のために用いられるマークアップ言語がXMLである。XMLでは、自分の目的に応じてタグを定義することが可能である。XMLによって記述した文書にRDFやOWLを使ってタグを付け加えると、このデータの意味を記したタグが文書の持つ意味を形式化して、コンピュータによる自動的な情報の収集・分析が実行される。なお、セマンティック・ウェブはXMLの他にも、各種の標準およびツール群から構成されている。  プログラミングの歴史を辿ってみると、数学を基礎にしながら、それがコミュニケーションとその組織化の問題に関する考えの発展だということが明らかになる。デジタル技術は、結局のところ、コミュニケーションの一つのあり方にほかならない。 人間の命も海から来たんだ JAVA JAVA いにしえの この海に癒される JAVA JAVA とこしえの この空に癒される 生き物の命は海から来たんだ JAVA JAVA いにしえの この海に癒される JAVA JAVA とこしえの この空に癒される (Godiego “JAVA WA JAVA”) 4 デジタルネイティブとWeb2.0  2008年11月11日、NHK総合テレビは『NHKスペシャル デジタルネイティブ〜次代を変える若者たち〜』を放映している。今のティーンエージャーは、子供の頃から、インターネットを始めとするデジタル・テクノロジーに囲まれて育ち、言ってみれば「デジタルネイティブ」である。彼らは「自ら情報を発信し共有することで成立するネット・コミュニティ」を自由自在に使いこなし、多くの匿名の人々と瞬時にコネクトして、新たな「価値」を創出している。既存の限界をブレーク・スルーし、世界を変える可能性があるのではないとさえ思われている。最近、彼らに関する各種の研究が進み始めている。  デジタルネイティブの時代が真の意味で「Web2.0」と言えるだろう。2004年、アイルランド出身のティム・ライリーがこの概念を提唱する。ただ、彼の定義は明確ではない。その後の展開を踏まえて、それを要約するならば、インターネットが社会を変えた時代から脱却して、それが双方向になったということである。社会の方がウェブに影響を及ぼしているというわけだ。「ソーシャル・グラフ」をオンラインに形成しようとするFacebookがその典型である。この「グラフ」はグラフ理論の場合と同様の意味である。ウェブ2.0は、現実社会に見られるコミュニケーションの多様性をネット上でも発展的に実現させようとする。で残念ながら、日本の文学や映画、テレビは依然としてこのウェブ2.0の意味について理解しておらず、依然として古めかしいネットの社会に及ぼす影響という認識の作品が発表され続けている。  ネイティブは、暗黙知によって、自分で直感的に適不適を判断できる。しかし、往々にして、それを説明するための言語化、すなわち明示化することができない。一方、ノンネイティブは明示知を通じてそれを理解し、習得しているので、その理屈を語れる。前者が言語を獲得するのに対し、後者は習得する。日本語のネイティブ・スピーカーは「こそあど言葉」を巧みに使い分けるが、それがどのような場面にふさわしいかについて論理的に説明することは難しい。ところが、日本語を外国語として習得した場合、「これ」が話者のテリトリー内にあるものを指し、「それ」が相手の領域、「あれ」がいずれにも属していないものに用いると理解している。人生の先輩とも言える老夫婦が「これ」や「それ」でなく、「あれ」で会話をしているのも、こうした理由による。ただ、ノンネイティブは理解が習得した範囲に限定されてしまう。  ネイティブは暗黙のうちにできる。そうして行っていることの中に明示化されていない何ものかが見つかるかもしれない。デジタルネイティブに期待されるのはそういった点だろう。その反面、ネイティブはリテラシーから認識することが不得手である。コミュニケーションは、いかなるものであっても、リテラシー、すなわち共通理解に基づいている。ネイティブは、しばしばノンネイティブからの問いかけによって、暗黙知を明示化すべく意識化しようとする。ノンネイティブは、ネイティブにとって、他者である。人は他者として接するとき、普段はどんなに情緒的であったり、一貫性がなかったりしていても、論理的になる。他者はたんなる懐疑主義者ではない。論理主義者である。  ネイティブ・スピーカーであっても、実際には、ノンネイティブの感覚をよく体験している。それは敬語表現である。敬語にネイティブは存在しない。誰もが獲得ではなく、習得しなければならない。口にした後で、「これでいいんだっけ?」と心の中で自問することも少なくない。  1990年代半ば、秋本治虫は、『こちら葛飾区亀有公園前派出所』において、デジタル機器を使いこなす「+(プラス)」という名前の小学生を登場させている。このサイバー・ボーイはインターネットを駆使して、グローバル規模で交友し、ビジネスを始めるなどまさにデジタルネイティブである。デジタルネイティブの出現は、その当時でさえ、すでに時間の問題である。しかし、そのデジタルネイティブの親たちも、かつてはビデオの録画予約もできない先行世代を「機械音痴」と馬鹿にしていたものである。  最新テクノロジーを使いこなせること自体は、必ずしも、将来性を期待させるものではない。最新のものは、流行語が教えてくれるように、概して、すぐに陳腐化する。基本原理を十分に踏まえ、本質的な理解を目指す方が有望である。デジタルネイティブに見るべきはその行動力と社交力であろう。  デジタルネイティブであったとしても、新たなソフトウェアやウェブ上のサービスを創出しようとしたら、画期的なプログラムを書く必要がある。けれども、プログラム言語にネイティブ・スピーカーは存在しない。その用法の適不適は入門者や解説書の類で確認しなければならない。エスペラントにおけるラザロ・ルドヴィコ・ザメンホフに相当する開発者と習得者がいるだけである。言語習得のみがあり、言語獲得はない。ソフトウェアを見ると、ついついプログラミングから考えてしまうプログラマもいることだろう。プログラム言語はすべての人にとって外国語であり、あくまで明示知の世界である。暗黙知だけではなく、この明示知とどのように向き合っていくかは依然としてデジタル技術の課題である。  プログラムというのはおかしい世界でして、ミスがいっぱいあるのです。特に大型のプログラムになると、ミスがありながらも、なんとなくつじつまがあえばいいという。前にコンピューター屋さんと話していまして、いいプログラムはどういうものかというと、ミスのないプログラムではない、と。プログラムのミスのことを虫(バグ)と言うが、虫がウロウロ動き回らないようにおとなしくすみ分けしていて、虫が異常発生すると、それにすぐに気がつくようなプログラムだ、と言うのです。 (森毅『数学と人間の風景』) 〈了〉 参考文献 朝日新聞社編、『100人の20世紀下』、朝日新聞社、2000年 梅田望夫、『ウェブ進化論』、ちくま新書、2006年 奥村晴彦他、『Javaによるアルゴリズム辞典』、技術評論社、2003年 木下淳二、『夕鶴・彦市ばなし』、新潮文庫、1954年 金田一秀穂、『「汚い」日本語講座』、伸張新書、2008年 寺坂英孝編、『現代数学小事典』、講談社ブルーバックス、1977年 道家達将=赤木盛夫、『科学と技術の歴史』、放送大学教育振興会、1999年 長岡亮介=岡本久、『新訂数学とコンピュータ』、放送大学教育振興会、2006年 本間之英、『社名の由来』、講談社、2002年 森毅、『数学的思考』、講談社学術文庫、1991年 森毅、『数学と人間の風景』、NHKライブラリー、1995年 森毅、『時代の寸法』、文藝春秋、1998年 E・W・ダイクストラ、『構造化プログラミング』、野下浩平訳、サイエンス社、一九七五年 アラン・C・ケイ、『アラン・ケイ』、鶴岡雄二訳、アスキー、1992年 DVD『エンカルタ総合大百科2008』、マイクロソフト社、2008年 株式会社豊田自動織機 http://www.toyota-shokki.co.jp/ トヨタ自動車株式会社 W3C Semantic Web O'Reilly. ‘What
  Is Web 2.0’. ”O'Reilly.com” http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html Miliband, David. ’”War on Terror” was wrong’. “The Guardian” 15, Jan, 2009 http://www.guardian.co.uk/commentisfree/2009/jan/15/david-miliband-war-terror |